#include "LinkList.h"

/*初始化链表*/
Status InitList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(LNode));
    if (!L)
    {
        return ERROR;
    }
    (*L)->next = NULL;
}

/*销毁线性表*/
void DestroyList(LinkList *L)
{
    LinkList temp;
    while (*L)
    {
        temp = (*L)->next;
        free(*L);
        *L = temp;
    }
}

/*清空线性表*/
void ClearList(LinkList L)
{
    LinkList p = L->next;
    L->next = NULL;
    DestroyList(&p);
}

/*判断是否为空*/
Status isEmpty(LinkList L)
{
    if (L->next)
    {
        return FALSE;
    }
    else
    {
        return FALSE;
    }
}

/*获取长度*/
int GetLength(LinkList L)
{
    int i = 0;
    LinkList p = L->next;
    while (p)
    {
        i++;
        p = p->next;
    }
    return i;
}

/*根据位置获取元素*/
Status GetElem(LinkList L, int i, DataType *e)
{
    int j = 1;
    LinkList p = L->next;
    while (p && j < i)
    {
        j++;
        p = p->next;
    }
    if (!p || j > i)
    {
        return ERROR;
    }
    *e = p->data;
    return OK;
}

/*比较两个元素是否相等*/
Status compare(DataType e1, DataType e2)
{
    if (e1 == e2)
    {
        return TRUE;
    }
    else if (e1 < e2)
    {
        return FALSE;
    }
    else
    {
        return ERROR;
    }
}

/*查找指定元素位置*/
Status FindData(LinkList L, DataType elem, Status (*compare)(DataType e1, DataType e2))
{
    int i = 0;
    LinkList p = L->next;
    while (p)
    {
        i++;
        if (compare(elem, p->data))
        {
            return i;
        }
        p = p->next;
    }
    return 0;
}

/*获取前驱元素*/
Status PreElem(LinkList L, DataType cur_e, DataType *pre_e)
{
	LinkList q, p = L->next;
	while (p->next)
	{
		q = p->next;
		if (q->data == cur_e)
		{
			*pre_e = p->data;
			return OK;
		}
		p = q;
	}
	return ERROR;
}

/*获取后继元素*/
Status NextElem(LinkList L, DataType cur_e, DataType *next_e)
{
	LinkList p = L->next;
	while (p->next)
	{
		if (p->data == cur_e)
		{
			*next_e = p->next->data;
			return OK;
		}
		p = p->next;
	}
	return ERROR;
}



Status InsertElem(LinkList L, int i, DataType e)
{
	int j = 0;
	LinkList s, p = L;
	while (p && j < i - 1)
	{
		j++;
		p = p->next;
	}
	if (!p || j > i - 1)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

/*删除元素并返回值*/
Status DeleteElem(LinkList L, int i, DataType *elem)
{
    LinkList q, p = L->next;
    int j = 0;
    while (p->next && j < i - 1)
    {
        j++;
        p = p->next;
    }
    if (!p->next || j > i - 1)
    {
        return ERROR;
    }
    q = p->next;
    p->next = q->next;
    *elem = q->data;
    free(q);
    return OK;
}

/*访问元素*/
void Visit(DataType elem)
{
    printf("%d ", elem);
}

/*遍历线性表*/
void TraverseList(LinkList L, void (*Visit)(DataType))
{
    LinkList p = L->next;
    while (p)
    {
        Visit(p->data);
        p = p->next;
    }
}